
/**
 * 缓动动画
 * @param obj : 运动对象
 * @param json: 运动属性
 * @param fn  : 运动完成后执行函数 --- 回调函数
 */
 function buffer(obj, json, fn) {
    // 1.1 清除定时器
    clearInterval(obj.timer);
  
    // 1.2 设置定时器
    var begin = 0, target = 0, speed = 0;
    obj.timer = setInterval(function () {
      // 1.3.0 旗帜
      var flag = true;
      for (var k in json) {
        // 1.3 获取初始值
        if ("opacity" === k) { // 透明度
          begin = Math.round(parseFloat(getCSSAttrValue(obj, k)) * 100) || 100;
          target = parseInt(json[k] * 100);
        } else if ("scrollTop" === k) {
          begin = Math.ceil(obj.scrollTop);
          target = parseInt(json[k]);
        } else { // 其他情况
          begin = parseInt(getCSSAttrValue(obj, k)) || 0;
          target = parseInt(json[k]);
        }
  
        // 1.4 求出步长
        speed = (target - begin) * 0.2;
  
        // 1.5 判断是否向上取整
        speed = (target > begin) ? Math.ceil(speed) : Math.floor(speed);
  
        // 1.6 动起来
        if ("opacity" === k) { // 透明度
          // w3c的浏览器
          obj.style.opacity = (begin + speed) / 100;
          // ie 浏览器
          obj.style.filter = 'alpha(opacity:' + (begin + speed) + ')';
        } else if ("scrollTop" === k) {
          obj.scrollTop = begin + speed;
        } else {
          obj.style[k] = begin + speed + "px";
        }
  
        console.log(begin, target);
  
        // 1.5 判断
        if (begin !== target) {
          flag = false;
        }
      }
  
      // 1.3 清除定时器
      if (flag) {
        clearInterval(obj.timer);
  
        console.log(fn);
  
        // 判断有没有回调函数
        if (fn) {
          fn();
        }
      }
    }, 20);
  }
  
  